﻿using LWH;
using LWH.ByteProtocol;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace ByteProtocolCSharpDemo
{

    class SimpleProtocolFactory : AbstractProtocolFactory<CircularByteBuffer>
    {
        //定义一个用于协助处理黏包分包的协议对象
        SimpleProtocol mParseProtocol = new SimpleProtocol();

        /// <summary>
        /// 解析帧头，这里提供了一个数据池CircularByteBuffer和对应的帧头解析方法，
        /// 可以使用其他数据池，自己控制数据的储存读取对比，只要返回true就会调用
        /// 下面的getProtocol进行协议的进一步解析
        /// </summary>
        /// <param name="dataQueue"></param>
        /// <returns></returns>
        protected override bool matchHeader(CircularByteBuffer dataQueue)
        {
            return ProtocolParseTool.matchHeader(dataQueue, mParseProtocol.getHeaderProperty().getData());
        }

        /// <summary>
        /// 在帧头解析成功后，进一步对协议的解析，这里的例子中dataQueue第一个可读取byte就是匹配的帧头
        /// </summary>
        /// <param name="dataQueue"></param>
        /// <returns></returns>
        protected override AbstractProtocol getProtocol(CircularByteBuffer dataQueue)
        {
            SimpleProtocol getProtocol = null;

            //将解析协议包装成解析属性，尝试获取，tryGetData返回true表示获取成功
            ByteBufferParseProperty protocolParseProperty = new ByteBufferParseProperty(mParseProtocol);
            if (protocolParseProperty.tryGetData(dataQueue))
            {
                getProtocol = new SimpleProtocol(dataQueue.Dequeue(protocolParseProperty.getLength()));
            }

            return getProtocol;
        }
    }
}
